print("集合##################################################start")
from collections import namedtuple
# namedtuple是一个函数，它用来创建一个自定义的tuple对象，并且规定了tuple元素的个数，
# 并可以用属性而不是索引来引用tuple的某个元素
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
print(p.x)
print(p.y)
print(isinstance(p, Point))
print(isinstance(p, tuple))


from collections import deque
# deque是为了高效实现插入和删除操作的双向列表，适合用于队列和栈
q = deque(['a', 'b', 'c'])
print(q)
q.append("d")
q.appendleft("aa")
print(q)


from collections import defaultdict
# 使用dict时，如果引用的Key不存在，就会抛出KeyError。
# 如果希望key不存在时，返回一个默认值，就可以用defaultdict
# defaultdict的其他行为跟dict是完全一样的
dd = defaultdict(lambda: 'null')
print(dd)
dd["key"] = "wx"
print(dd["key"])
print(dd["key2"])

from collections import OrderedDict
# OrderedDict按照插入的顺序排列
od = OrderedDict()
od['a'] = 1
od['c'] = 2
od['d'] = 4
print(od)
print(od.keys())

from collections import ChainMap
import os, argparse

# 构造缺省参数:
defaults = {
    'color': 'red',
    'user': 'guest'
}

# 构造命令行参数:
parser = argparse.ArgumentParser()
parser.add_argument('-u', '--user')
parser.add_argument('-c', '--color')
namespace = parser.parse_args()
print(namespace)
command_line_args = { k: v for k, v in vars(namespace).items() if v }
print(command_line_args)
# 组合成ChainMap:
combined = ChainMap(command_line_args, os.environ, defaults)

# 打印参数:
print('color=%s' % combined['color'])
print('user=%s' % combined['user'])
# 用程序往往都需要传入参数，参数可以通过命令行传入，可以通过环境变量传入，还可以有默认参数。
# 我们可以用ChainMap实现参数的优先级查找，即先查命令行参数，如果没有传入，再查环境变量，
# 如果没有，就使用默认参数。

from collections import Counter
# Counter是一个简单的计数器
c = Counter()
for ch in 'programming': # 统计字符出现的个数
    c[ch] = c[ch] + 1
print(c)
print("集合##################################################end\n")